#!/bin/bash

# CU MR BULL 生产环境部署脚本
# 自动化部署到真实服务器

set -e

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 配置
SERVER_IP="47.237.10.129"
SERVER_USER="root"
APP_NAME="cu-mr-bull-api"
REMOTE_DIR="/var/www/cumrbull-api"
FRONTEND_DIR="/var/www/cumrbull-frontend"
API_DOMAIN="api.cumrbull.com.sg"
ADMIN_DOMAIN="admin.cumrbull.com.sg"

# 日志函数
log() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] ✓${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] ⚠${NC} $1"
}

log_error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ✗${NC} $1"
}

# 错误处理
error_exit() {
    log_error "$1"
    exit 1
}

# 检查SSH连接
check_server_connection() {
    log "检查服务器连接..."
    if ! ssh -o ConnectTimeout=10 $SERVER_USER@$SERVER_IP "echo 'SSH连接成功'" > /dev/null 2>&1; then
        error_exit "无法连接到服务器 $SERVER_IP，请检查SSH配置"
    fi
    log_success "服务器连接正常"
}

# 准备服务器环境
setup_server_environment() {
    log "准备服务器环境..."
    
    ssh $SERVER_USER@$SERVER_IP << 'EOF'
        # 更新系统
        apt update && apt upgrade -y
        
        # 安装Node.js 18
        curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
        apt-get install -y nodejs
        
        # 安装PM2
        npm install -g pm2
        
        # 安装Nginx
        apt install -y nginx
        
        # 安装Certbot
        apt install -y certbot python3-certbot-nginx
        
        # 创建项目目录
        mkdir -p /var/www/cumrbull-api
        mkdir -p /var/www/cumrbull-frontend
        mkdir -p /var/log/nginx
        
        # 设置防火墙
        ufw allow 22
        ufw allow 80
        ufw allow 443
        ufw --force enable
EOF
    
    log_success "服务器环境准备完成"
}

# 部署后端代码
deploy_backend() {
    log "部署后端代码..."
    
    # 打包后端文件
    tar -czf backend.tar.gz -C backend .
    
    # 上传到服务器
    scp backend.tar.gz $SERVER_USER@$SERVER_IP:$REMOTE_DIR/
    
    # 在服务器上解压和配置
    ssh $SERVER_USER@$SERVER_IP << EOF
        cd $REMOTE_DIR
        tar -xzf backend.tar.gz
        rm backend.tar.gz
        
        # 安装依赖
        npm install --production
        
        # 复制生产环境配置
        cp .env.production .env
        
        # 设置权限
        chown -R www-data:www-data $REMOTE_DIR
        chmod -R 755 $REMOTE_DIR
EOF
    
    # 清理本地临时文件
    rm backend.tar.gz
    
    log_success "后端代码部署完成"
}

# 部署前端代码
deploy_frontend() {
    log "部署前端代码..."
    
    # 复制管理后台文件
    scp admin-production.html $SERVER_USER@$SERVER_IP:$FRONTEND_DIR/index.html
    
    # 设置权限
    ssh $SERVER_USER@$SERVER_IP << EOF
        chown -R www-data:www-data $FRONTEND_DIR
        chmod -R 755 $FRONTEND_DIR
EOF
    
    log_success "前端代码部署完成"
}

# 配置Nginx
setup_nginx() {
    log "配置Nginx..."
    
    # 上传Nginx配置
    scp manual-nginx-config.conf $SERVER_USER@$SERVER_IP:/etc/nginx/conf.d/cu-mr-bull.conf
    
    # 测试Nginx配置
    ssh $SERVER_USER@$SERVER_IP << 'EOF'
        nginx -t
        if [ $? -eq 0 ]; then
            systemctl reload nginx
            systemctl enable nginx
        else
            echo "Nginx配置错误"
            exit 1
        fi
EOF
    
    log_success "Nginx配置完成"
}

# 获取SSL证书
setup_ssl() {
    log "配置SSL证书..."
    
    ssh $SERVER_USER@$SERVER_IP << EOF
        # 获取SSL证书
        certbot --nginx -d $API_DOMAIN -d $ADMIN_DOMAIN --non-interactive --agree-tos --email admin@cumrbull.com.sg
        
        # 设置自动续期
        crontab -l | { cat; echo "0 12 * * * /usr/bin/certbot renew --quiet"; } | crontab -
EOF
    
    log_success "SSL证书配置完成"
}

# 启动应用服务
start_application() {
    log "启动应用服务..."
    
    ssh $SERVER_USER@$SERVER_IP << EOF
        cd $REMOTE_DIR
        
        # 停止现有进程
        pm2 stop $APP_NAME || true
        pm2 delete $APP_NAME || true
        
        # 启动新进程
        pm2 start production-server.js --name $APP_NAME
        
        # 保存PM2配置
        pm2 save
        pm2 startup
EOF
    
    log_success "应用服务启动完成"
}

# 测试部署
test_deployment() {
    log "测试部署结果..."
    
    # 等待服务启动
    sleep 10
    
    # 测试API健康检查
    if curl -f -s "https://$API_DOMAIN/health" > /dev/null; then
        log_success "API服务器响应正常"
    else
        log_error "API服务器无响应"
    fi
    
    # 测试管理后台
    if curl -f -s "https://$ADMIN_DOMAIN" > /dev/null; then
        log_success "管理后台访问正常"
    else
        log_error "管理后台无法访问"
    fi
    
    # 显示服务状态
    ssh $SERVER_USER@$SERVER_IP << 'EOF'
        echo "=== PM2进程状态 ==="
        pm2 status
        
        echo "=== Nginx状态 ==="
        systemctl status nginx --no-pager
        
        echo "=== 最近的应用日志 ==="
        pm2 logs cu-mr-bull-api --lines 10
EOF
}

# 主部署流程
main() {
    log "开始CU MR BULL生产环境部署..."
    
    # 检查本地文件
    if [ ! -f "backend/production-server.js" ]; then
        error_exit "后端文件不存在，请检查项目结构"
    fi
    
    if [ ! -f "admin-production.html" ]; then
        error_exit "前端文件不存在，请检查项目结构"
    fi
    
    # 执行部署步骤
    check_server_connection
    setup_server_environment
    deploy_backend
    deploy_frontend
    setup_nginx
    setup_ssl
    start_application
    test_deployment
    
    log_success "🎉 部署完成！"
    echo ""
    echo "访问地址："
    echo "  API服务器: https://$API_DOMAIN/health"
    echo "  管理后台: https://$ADMIN_DOMAIN"
    echo ""
    echo "管理员登录信息："
    echo "  邮箱: admin@example.com"
    echo "  密码: 123456"
}

# 显示帮助信息
show_help() {
    echo "CU MR BULL 生产环境部署脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help     显示帮助信息"
    echo "  --backend-only 仅部署后端"
    echo "  --frontend-only 仅部署前端"
    echo "  --test-only    仅运行测试"
    echo ""
}

# 处理命令行参数
case "$1" in
    -h|--help)
        show_help
        exit 0
        ;;
    --backend-only)
        log "仅部署后端..."
        check_server_connection
        deploy_backend
        start_application
        ;;
    --frontend-only)
        log "仅部署前端..."
        check_server_connection
        deploy_frontend
        ;;
    --test-only)
        log "仅运行测试..."
        test_deployment
        ;;
    "")
        main
        ;;
    *)
        echo "未知选项: $1"
        show_help
        exit 1
        ;;
esac